#ifndef __SE_DICTIONARY_PRODUCER_HPP__
#define __SE_DICTIONARY_PRODUCER_HPP__

#include "Configuration.hpp"
#include <map>
#include <set>
#include <vector>
#include <string>

namespace se {

//类的前项声名
class SplitTool;

// 字典生成类
class DictionaryProducer {
public:
    DictionaryProducer(const std::string &stop, const std::string &directory);
    //处理中文
    DictionaryProducer(const std::string &stop, const std::string &directory, SplitTool *splitTool);
    
    /**
     * @brief 创建英文字典
     * $param
     * return void 
     */
    void buildEnDictionary();

    /**
     * @brief 创建中文字典
     * $param
     * return void 
     */
    void buildCnDictionary();

    /**
     * @brief 通过单个文件增加字典内容
     * @param fileName 文件名
     * @return void
     */
    /* void createDictionaryWithFile(const std::string &fileName); */

    /**
     * @brief 将词典写入文件
     * @param filepath 文件路径
     * @return void
     */
    void storeDictionary(const std::string &filename);

    /* void showFiles() const; */
    /* void showDictionary() const; */
    
    /**
     * @brief 获取文件的绝对路径
     * @param 
     * @return void
     */
    void getFiles();

    /**
     * @brief 处理不合法的单词
     * @param word 要处理的单词
     */
    void dealWord(const std::string &word);

    /**
     * @brief 存储某个单词
     * @param word 要存储的单词
     * @return void
     */
    void pushDictionary(const std::string &word);

    /**
     * brief 读取英文停用词文件
     * return void
     */
    void readEnStopList();

    /**
     * @brief 读取中文停用词文件
     * @return void
     */
    void readCnStopList();

    /**
     * @brief 生成索引文件
     * @param src 是词频文件的路径
     * @param obj 是生成的索引文件的路径
     * @return void
     */
    static void createIndex(std::string src, std::string obj);

    std::vector<std::pair<std::string, int32_t>> &getDictionary() { return this->_dictionaryVector; }
    std::map<std::string, std::set<int64_t>> &getIndex() { return this->_index; }

private:
    void dictionaryMapToVector();

private:
    std::set<std::string> _StopList;
    std::vector<std::string> _files;  // 语料文件的绝对路径集合
    std::vector<std::pair<std::string, int32_t>> _dictionaryVector;  // 词典<单词, 出现次数>
    std::map<std::string, int32_t> _dictionary;
    SplitTool *_splitTool; //分词工具
    std::map<std::string, std::set<int64_t>> _index;  // 词典索引<单词, 出现的文件及行号集合>
};

}  // namespace se

#endif
